﻿using Microsoft.Office.Interop.Excel;
using Microsoft.Win32;
using PFC.CustomControls;
using ScottPlot;
using ScottPlot.Plottable;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Runtime.InteropServices;
using System.Runtime.Remoting.Messaging;
using System.Security.Policy;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Excel = Microsoft.Office.Interop.Excel;
using Page = System.Windows.Controls.Page; // возможно нужно убрать

namespace PFC.Program.Profile.Pages
{
    /// <summary>
    /// Логика взаимодействия для Main.xaml
    /// </summary>
    /// 

    /* Класс со свойствами для передачи данных транизакции в кастомный ListBox */
    public class DataTransactions
    {
        public string Category { get; set; }
        public int Sum { get; set; }
        public string Description { get; set; }
        public string Date { get; set; }
    }

    public partial class Main : Page
    {
        string filepathExcel = ""; // путь к создаваемому файлу Excel

        public Main()
        {
            InitializeComponent();

            // Объявление переменных и массива для генерации диаграммы
            int walletID = GlobalVaribles.selectWallet; // ID кошелька
            int index = 0;                              // индекс массива
            double[] sums = { };                        // сумма

            // Передача кол-ва транзакций
            SqlDataReader readerCountTx = ClassRequests.GetCountTxs(walletID);
            while (readerCountTx.Read())
            { sums = new double[Convert.ToInt32(readerCountTx["amount"])]; }
            readerCountTx.Close();
            CommonClass.GetConnection().Close();

            // Передача суммы транзакции
            SqlDataReader readerInfoTx = ClassRequests.GetInfo_AboutTx(walletID);
            while (readerInfoTx.Read())
            { sums[index] = Convert.ToInt32(readerInfoTx["sum"]); index++; }
            readerInfoTx.Close();
            CommonClass.GetConnection().Close();

            // Добавление бара
            if (sums.Length > 0)
            {
                BarPlotBorder.Visibility = Visibility.Visible;
                var bar = BarPlot.Plot.AddBar(sums);

                // Настройка бара
                bar.ShowValuesAboveBars = true;
                bar.Font.Color = System.Drawing.Color.Black;
                bar.FillColorNegative = System.Drawing.Color.Red;
                bar.Font.Size = 18;
                bar.Font.Bold = true;
                bar.FillColor = System.Drawing.Color.Green;
                BarPlot.Plot.AxisAuto(0, 0);
                BarPlot.Plot.Margins(x: .4, y: .4);
                BarPlot.Plot.Frameless();

                // Обновление бара
                BarPlot.Refresh();
            }
            else
                BarPlotBorder.Visibility = Visibility.Hidden;

            // Передача имени кошелька
            nameWallet_Txb.Text = GlobalVaribles.nameSelectedWallet;

            // Вывод информации обо всех транзакциях 
            SqlDataReader readerInformation = ClassRequests.GetInfo_AboutTx(GlobalVaribles.selectWallet);

            while (readerInformation.Read())
            {
                listTransactions_Lbx.Items.Add(
                    new DataTransactions()
                    {
                        Category = readerInformation["name"].ToString(),
                        Sum = Convert.ToInt32(readerInformation["sum"]),
                        Description = readerInformation["description"].ToString(),
                        Date = readerInformation["date"].ToString(),
                    } );
            }
            readerInformation.Close();
            CommonClass.GetConnection().Close();

            // Передача баланса в окно
            balance_Lb.Content = GlobalVaribles.balanceCurrentUser + " РУБ.";
        }

        /* Переход на страницу для пополнения баланса */
        private void ProfitPage_Wrap_Click(object sender, RoutedEventArgs e)
        {
            var ClickedButton = e.OriginalSource as NavButton;
            NavigationService.Navigate(ClickedButton.NavUri);
        }

        /* Переход на страницу для траты баланса */
        private void ExpensePage_Wrap_Click(object sender, RoutedEventArgs e)
        {
            var ClickedButton = e.OriginalSource as NavButton;
            NavigationService.Navigate(ClickedButton.NavUri);
        }

        /* Переход на страницу расхода или дохода */
        private void NavButton_Click(object sender, RoutedEventArgs e)
        {
            var ClickedButton = e.OriginalSource as NavButton;
            NavigationService.Navigate(ClickedButton.NavUri);
        }

        /* На предыдущую страницу */
        private void back_Btn_Click(object sender, RoutedEventArgs e)
        {
            this.NavigationService.Navigate(new Wallets());
        }

        /* Экспорт данных в Excel */
        private void exportInExel_NavBtn_Click(object sender, RoutedEventArgs e)
        {
            SaveFileDialog saveFileDialog = new SaveFileDialog
            { Filter = "Файлы Excel (*.xlsx)|*.xlsx" };
            
            // Открываем окно, куда будем сохранять файл Excel
            if (saveFileDialog.ShowDialog() == true) { filepathExcel = saveFileDialog.FileName; }

            // Создаем список для транзакций
            List<DataTransactions> dataTransactions = new List<DataTransactions>();

            // Передаем данные из таблицы в 'dataTransactions'
            SqlDataReader readerInformation = ClassRequests.GetInfo_AboutTx(GlobalVaribles.selectWallet);

            while (readerInformation.Read())
            {
                dataTransactions.Add(
                    new DataTransactions()
                    {
                        Category = readerInformation["name"].ToString(),
                        Sum = Convert.ToInt32(readerInformation["sum"]),
                        Description = readerInformation["description"].ToString(),
                        Date = readerInformation["date"].ToString(),
                    });
            }
            readerInformation.Close();
            CommonClass.GetConnection().Close();

            // Описываем необходимую структуру для создания Excel книги и таблицы
            Excel.Application app = new Excel.Application();
            Workbook mWorkBook = app.Workbooks.Add(System.Reflection.Missing.Value);
            Worksheet mWSheet1 = (Worksheet)mWorkBook.Worksheets.get_Item(1);

            // Создаем ячейки с данными
            mWSheet1.Cells[1, 1] = "Категория";
            mWSheet1.Cells[1, 1].Font.Bold = true;

            mWSheet1.Cells[1, 2] = "Сумма";
            mWSheet1.Cells[1, 2].Font.Bold = true;

            mWSheet1.Cells[1, 3] = "Описание";
            mWSheet1.Cells[1, 3].Font.Bold = true;

            mWSheet1.Cells[1, 4] = "Дата";
            mWSheet1.Cells[1, 4].Font.Bold = true;

            // Указываем ширину ячеек
            mWSheet1.Columns[1].ColumnWidth = 15;
            mWSheet1.Columns[2].ColumnWidth = 15;
            mWSheet1.Columns[3].ColumnWidth = 15;

            int i = 2; // переменная приращения данных из dataTransactions

            // Перекидываем данные из списка в ячейки
            foreach (DataTransactions tx in dataTransactions)
            {
                mWSheet1.Cells[i, 1] = tx.Category;
                mWSheet1.Cells[i, 2] = tx.Sum;
                mWSheet1.Cells[i, 3] = tx.Description;
                mWSheet1.Cells[i, 4] = tx.Date;
                i++; 
            }

            // Сохраняем книгу
            try
            {
                mWorkBook.SaveAs(filepathExcel, System.Reflection.Missing.Value,
                                           System.Reflection.Missing.Value,
                                           System.Reflection.Missing.Value,
                                           System.Reflection.Missing.Value,
                                           System.Reflection.Missing.Value,
                                           XlSaveAsAccessMode.xlExclusive,
                                           System.Reflection.Missing.Value,
                                           System.Reflection.Missing.Value,
                                           System.Reflection.Missing.Value,
                                           System.Reflection.Missing.Value,
                                           System.Reflection.Missing.Value);
            }
            catch (Exception) { return; }

            // Предлагаем открыть файл
            MessageBoxResult result = MessageBox.Show("Ты хочешь открыть файл?", "Открытие файла",
                                                      MessageBoxButton.YesNo, MessageBoxImage.Information);

            if (result.Equals(MessageBoxResult.Yes))
                OpenFile();
            else MessageBox.Show($"Твой файл в формате .xls ждет тебя по следующему пути {filepathExcel}",
                                   "Расположение файла", MessageBoxButton.OK, MessageBoxImage.Information);

            // Закрываем книгу и приложение
            mWorkBook.Close(System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value);
            app.Quit();

            // Необходимая структура для завершения
            GC.WaitForPendingFinalizers();
            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();

            Marshal.ReleaseComObject(mWSheet1);
            Marshal.ReleaseComObject(mWorkBook);
            Marshal.ReleaseComObject(app);
        }

        /* Метод открытия созданного файла Excel */
        private void OpenFile()
        {
            try
            {
                var excelApp = new Excel.Application();
                excelApp.Visible = true;
                Workbooks books = excelApp.Workbooks;
                Workbook sheets = books.Open(filepathExcel);
            } catch (Exception ex) {
                MessageBox.Show(ex.ToString());
            }
        }

        /* Метод удаления кошелька */
        private void deleteWallet_NavBtn_Click(object sender, RoutedEventArgs e)
        {
            MessageBoxResult result = MessageBox.Show("Вы уверены, что хотите удалить кошелек?",
                                                      "Удаление кошелька",
                                                      MessageBoxButton.YesNo, MessageBoxImage.Warning);
            if (result == MessageBoxResult.Yes)
            {
                bool IsDelete = ClassRequests.DeleteWallet();
                if (IsDelete == true) this.NavigationService.Navigate(new Wallets());
            }
            else return;
        }

        // Метод сброса последней транзакции
        private void restLastRecord_NavButton_Click(object sender, RoutedEventArgs e)
        {
            int sumLastTx = 0;

            // Передать сумму последней транзакции
            SqlDataReader readerLastTx = ClassRequests.GetLastSum_FromTxs(GlobalVaribles.selectWallet);
            while (readerLastTx.Read()) { sumLastTx = Convert.ToInt32(readerLastTx["sum"]); }

            readerLastTx.Close();
            CommonClass.GetConnection().Close();

            GlobalVaribles.balanceCurrentUser -= sumLastTx;

            ClassRequests.DeleteLastTx(GlobalVaribles.selectWallet);
            ClassRequests.UpdateBalance(GlobalVaribles.selectWallet, GlobalVaribles.balanceCurrentUser);

            // Очистка ListBox 
            listTransactions_Lbx.ItemsSource = null;
            listTransactions_Lbx.Items.Clear();

            // Восстановление списка
            SqlDataReader readerInformation = ClassRequests.GetInfo_AboutTx(GlobalVaribles.selectWallet);

            while (readerInformation.Read())
            {
                listTransactions_Lbx.Items.Add(
                    new DataExpenses()
                    {
                        Category = readerInformation["name"].ToString(),
                        Sum = Convert.ToInt32(readerInformation["sum"]),
                        Description = readerInformation["description"].ToString(),
                        Date = readerInformation["date"].ToString(),
                    });
            }
            readerInformation.Close();
            CommonClass.GetConnection().Close();

            // Изменение баланса
            balance_Lb.Content = GlobalVaribles.balanceCurrentUser + " РУБ.";

            // Для обновления бара
            this.NavigationService.Navigate(new Main());
        }
    }
}
